package queixa.reps;

import java.util.LinkedList;
import java.util.List;

import queixa.Queixa;
import util.Excecoes;
import util.IRepositorioRegistro;
import util.RepositorioRegistro;
import excecoes.ObjetoInexistenteException;
import excecoes.RepositorioException;
import guiasaude.reps.RepositorioUnidadeSaudeLista;

/**
 * @author tiago
 */

//INTERFACE
public class RepositorioQueixaLista implements IRepositorioQueixa {
//INTERFACE
//public class RepositorioQueixaLista {

	private List listaContas;

	private int geraCodigo = 0; // para gerar codigos das queixas cadastradas
	
	//DELEGATION
	private IRepositorioRegistro repRegistro;
	// SINGLETON
	private static RepositorioQueixaLista instance = null;

	/*public RepositorioQueixaLista() {
		this.listaContas = new LinkedList();
	}
	*/
	private RepositorioQueixaLista() {
		// inicializando o atributo delegation
		this.repRegistro = new RepositorioRegistro();		
	}
	public static RepositorioQueixaLista getInstance() {
		if (instance == null) {
			instance = new RepositorioQueixaLista();
		}
		return instance;
	}	
	//SINGLETON

	private int procurarIndice(int codigo) {
		int indice = 0;
		while (indice < listaContas.size()) {
			Queixa q = (Queixa) listaContas.get(indice);
			if (q.getCodigo() == codigo)
				return indice;
			indice++;
		}
		return -1;
	}

	/* (non-Javadoc)
	 * @see queixa.reps.IRepositorioQueixa#insere(queixa.Queixa)
	 */
	public int insere(Queixa q) throws RepositorioException {
		q.setCodigo(geraCodigo++);
		listaContas.add(q);
		return q.getCodigo();
	}

	/* (non-Javadoc)
	 * @see queixa.reps.IRepositorioQueixa#procura(int)
	 */
	public Queixa procura(int codigo) throws ObjetoInexistenteException {
		int indice = this.procurarIndice(codigo);
		if (indice >= 0)
			return (Queixa) this.listaContas.get(indice);
		else
			throw new ObjetoInexistenteException(Excecoes.EXC_FALHA_PROCURA);
	}

	/* (non-Javadoc)
	 * @see queixa.reps.IRepositorioQueixa#existe(int)
	 */
	public boolean existe(int codigo) {
		int indice = this.procurarIndice(codigo);
		if (indice >= 0)
			return true;
		else
			return false;

	}

	/* (non-Javadoc)
	 * @see queixa.reps.IRepositorioQueixa#atualiza(queixa.Queixa)
	 */
	public void atualiza(Queixa q) throws RepositorioException,
			ObjetoInexistenteException {
		int indice = this.procurarIndice(q.getCodigo());
		if (indice >= 0)
			this.listaContas.set(indice, q);
		else
			throw new ObjetoInexistenteException(Excecoes.EXC_FALHA_PROCURA);

	}

	/* (non-Javadoc)
	 * @see queixa.reps.IRepositorioQueixa#deleta(int)
	 */
	public void deleta(int codigo) throws RepositorioException,
			ObjetoInexistenteException {

	}

	/* (non-Javadoc)
	 * @see queixa.reps.IRepositorioQueixa#size()
	 */
	public int size() {
		return this.listaContas.size();
	}

	public Queixa getElemento(int posicao) {
		if (posicao < listaContas.size())
			return (Queixa) listaContas.get(posicao);
		else
			return null;
	}

}
